扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
经常发生的一件事是,在进行文件操作时,打开的文件必须及时关闭。无论是二进制流还是字符流,一旦在生成流时被打开,直到Close方法被调用之前,流所使用的资源都处于被占用的状态。所以,当资源已经不需要时,一定不要忘记调用Close方法。对于打开的文件,在finally中调用close方法,可以确保在发生异常时被关闭。
另外,不仅仅是针对文件,应该保持这样的警惕,即对有效资源(可能被共用)不可以长期占用。比如说下页中举的例子,数据库资源(java.sql.Connection,java.sql.Statement等)是典型的必须避免占用的资源。因此而引起的问题是经常发生的。
例子 ① 可能发生DB资源泄露的典型代码
… Connection con = null; PreparedStatement ps = null; Try{ Class.forName(“指定DB驱动”); //Load DB DriverManager con = Drivermanager.getConnection(“DB URL”); ps = con.prepareStatement(运行用SQL“); // 某种处理 ps.close(); //ERROR: 处理到这里之前如果发生异常,将无法关闭 con.close(); // ERROR: 处理到这里之前如果发生异常,将无法关闭 }catch(ClassNotFoundException e1){ e1.printStackTrace(); }catch(SQLException e2){ e2.printStackTrace(); } |
同①背景相同的代码
//某种处理
}catch(ClassNotFoundException e1){ e1.printStackTrace(); }catch(SQLException e2){ e2.printStackTrace(); }finally{ if( ps != null ){ try{ ps.close(); //OK:即使在处理中发生异常也可以保证关闭。 }catch(SQLException e3){ e3.printStackTrace(); } if( con != null){ try{ con.close(); //OK:即使在处理中发生异常也可以保证关闭。 }catch(SQLException e4){ e4.printStackTrace(); } } } |
Java语言中有垃圾回收机制,在Java的Heap上分配的对象,一般来说是不需要显式
地释放的。但是,被释放的资源仅是垃圾回收处理中被判断为“程序已经不使用”的部分。
详细内容可以参考该文章的补充5。
婵″倹鐏夐幃銊╂姜鐢瓕鎻╅崚鍥╂畱閹厖绨$憴顤廡妫板棗鐓欓張鈧弬棰侀獓閸濅椒绗岄幎鈧張顖欎繆閹垽绱濋柇锝勭疄鐠併垽妲勯懛鎶姐€婄純鎴炲Η閺堫垶鍋栨禒璺虹殺閺勵垱鍋嶉惃鍕付娴f娊鈧柨绶炴稊瀣╃閵嗭拷